/*
 ******************************************************************************************************************************************************************************************
 *@file                       touch.h
 *@author        触摸按键 功能   实现 ：  单击 、双击、 长按  检测
 *@data          2022/03/12
 *@version                    v1.0
 *@par Copyright(c):
 *
 *@par History:
 *     version:author,date,desc
 *     v1.0   :create this file
 *     v1.1   :修改长按 响应输出时间，长按时间达到，及输出相应的长按状态。
 * 	          例如：长按4S， 会依次输出  长按2S、长按4S.
 *
 *******************************************************************************************************************************************************************************************
 */

#ifndef _TOUCH_H
#define _TOUCH_H
#include "main.h"
#define printf_log 0
#define KEY_PARITY_ms 100 // 按键扫描周期   单位ms
// 按键使能
// #defined KEY_CLICK_EN 1
// #define KEY_DBLCLICK_EN 1
// #define KEY_LONG_PRESS_3S_EN 1
// #define KEY_LONG_PRESS_5S_EN 1
// #define KEY_LONG_PRESS_7S_EN 1

#if !defined LOW && !defined HIGHT
typedef enum
{
	LOW = 0,
	HIGHT = 1
} level;
#endif

#define Touch_Key_Effectivity_State LOW												// 按键有效状态
#define GPIO_Read_Key_Status() ll_gpio_read_input_data_bit(KEY_GPIOx, KEY_GPIO_PIN) // 触摸按键GPIO 定义

#define Key_DblClick_Time 400 / KEY_PARITY_ms			  // 双击间隔  1s   单位100ms
#define Key_Long_Press_Time_3s (3000 / KEY_PARITY_ms) - 1 // 长按时间  2s   单位100ms
#define Key_Long_Press_Time_5s (5000 / KEY_PARITY_ms) - 1 // 长按时间  4s   单位100ms
#define Key_Long_Press_Time_7s (7000 / KEY_PARITY_ms) - 1 // 长按时间  4s   单位100ms

// 按键状态
enum
{
	Key_Undo,  // 松开
	Key_Press, // 按下
};
// 按键状态
enum
{
	Key_Idle = 0,	   // 空闲
	Key_Click,		   // 单击
	Key_DblClick,	   // 双击
	Key_Three_Click,   // 三击
	Key_Long_Press_3s, // 长按
	Key_Long_Press_5s, // 长按
	Key_Long_Press_7s, // 长按
};

/**
 * 触摸按键数据定义：Data
 */
typedef struct
{
	unsigned int key_last_time;			   // 上一次触摸的时间，用于判断 连续点击的最小间隔
	unsigned char key_state;			   // 按键状态
	unsigned char key_press_time;		   // 按下的时间
	unsigned char key_press_count;		   // 按键按下的次数
	unsigned char key_long_press_3s_state; // 长按时检测按键上报状态，避免多次上报
	unsigned char key_long_press_5s_state; // 长按时检测按键上报状态，避免多次上报
	unsigned char key_long_press_7s_state; // 长按时检测按键上报状态，避免多次上报
	unsigned char key_actual_state;		   // 按键实际状态  用于部分指令需要按键松开在响应
	unsigned char key_last_state;		   // 上一次触摸的时间，用于判断 连续点击的最小间隔
} TOUCH_DATA_T;

#if 0
/*
set_touch_key_ststae
设置按键状态
*/
void set_touch_key_ststae(unsigned char state);

/*
set_touch_key_last_time
设置按键最后一次触摸的时间
*/
void set_touch_key_last_time(unsigned int time);
/*
get_touch_key_last_time
获取按键最后一次触摸的时间
*/
unsigned int get_touch_key_last_time(void);
/*
add_touch_key_last_time
按键最后一次触摸的时间   累计
*/
void add_touch_key_last_time(void);
/*
set_touch_key_press_time
设置按键按下的时间
*/
void set_touch_key_press_time(unsigned char time);
/*
add_touch_key_press_time
 按键按下的时间   累计
*/
void add_touch_key_press_time(void);
/*
get_touch_key_press_time
获取按键按下的时间
*/
unsigned char get_touch_key_press_time(void);
/*
get_key_actual_state
获取按键实际状态  用于部分指令需要按键松开在响应
*/
unsigned char get_key_actual_state(void);
#endif

/*
触摸按键初始化
*/
void touch_key_init(void);
/*
touch_data_init()
触摸按键数据初始化
*/
void touch_data_init(void);
/*
触摸按键 定时 扫描
*/
void touch_timing_scan(void);
/*
get_touch_key_ststae
获取按键状态
*/
unsigned char get_touch_key_ststae(void);
#endif
